﻿@page "/lotteries/drawlottery/{Id}"
@attribute [Authorize(Roles = "Admin")]

@inject IHttpService _httpService

@inject ILocalStorageService _localStorage


@inject NavigationManager NavigationManager
@inject IDataCacheService _dataCacheService
@inject ILogger<DrawLottery> _logger
@inject IPopupService PopupService

<CnGalWebSite.Shared.MasaComponent.Shared.Cards.TitleTip Title="抽奖" />

<div>
    @if (isReady)
    {
        <CnGalWebSite.Shared.Component.Lotteries.DrawPage.LotteryAnimationCard @ref="lotteryAnimationCard" OnClickRoll="OnDrawLottery" />

        <div class=" pa-4" style=" display: flex; flex-direction: column; align-items: center; font-size: x-large;">

            @if (CurrentAward == null)
            {
                <span class="fw-bold primary-text">抽奖结束</span>
            }
            else
            {
                @if (string.IsNullOrWhiteSpace(CurrentAward.Sponsor) == false)
                {
                    <span>
                        即将抽选由
                        <strong class="primary-text">  @CurrentAward.Sponsor</strong>
                        提供的
                        <strong class="primary-text">  @CurrentAward.Name</strong>
                    </span>
                }
                else
                {
                    <span>
                        即将抽选
                        <strong class="primary-text">  @CurrentAward.Name</strong>
                    </span>
                }
            }

            @if (LastWinningUser != null)
            {
                if (LastAward != null)
                {
                    @if (string.IsNullOrWhiteSpace(LastAward.Sponsor) == false)
                    {
                        <span>
                            恭喜用户
                            <strong class="primary-text">  @LastWinningUser.Name</strong>
                            获得由
                            <strong class="primary-text">  @LastAward.Sponsor</strong>
                            提供的
                            <strong class="primary-text">  @LastAward.Name</strong>
                        </span>
                    }
                    else
                    {
                        <span>
                            恭喜用户
                            <strong class="primary-text">  @LastWinningUser.Name</strong>
                            获得
                            <strong class="primary-text">  @LastAward.Name</strong>
                        </span>
                    }
                }

            }

            @if (string.IsNullOrWhiteSpace(CurrentAward?.Image) == false)
                {

                <img src="@CurrentAward.Image" alt="@CurrentAward.Name" style="max-width:200px;width:100%;margin-top:30px;"/>
                }


        </div>

    }
    else
    {
        <CnGalWebSite.Components.Progressings.ProgressingCard Page />
    }

</div>

@code {
    [Parameter]
    public string Id { get; set; }
    CnGalWebSite.Shared.Component.Lotteries.DrawPage.LotteryAnimationCard lotteryAnimationCard;
    public DrawLotteryDataModel Model = new DrawLotteryDataModel();

    public LotteryAwardDataModel CurrentAward;

    public LotteryUserDataModel LastWinningUser;
    public LotteryAwardDataModel LastAward;

    public LotteryAwardDataModel NextAward;

    public List<ManualLotteryModel> LotteryResults = new List<ManualLotteryModel>();

    [CascadingParameter]
    public ErrorHandler ErrorHandler { get; set; }

    bool isReady = false;
    bool isDrawing = false;

    protected override async Task OnInitializedAsync()
    {
        try
        {
            Model = await _httpService.GetAsync<DrawLotteryDataModel>("api/lotteries/GetLotteryData/" + Id);
            await GetAward();
            isReady = true;
        }
        catch (Exception ex)
        {
            await ErrorHandler.ProcessError(ex, "获取抽奖数据失败");
        }
    }

    public async Task OnDrawLottery()
    {
        if (isDrawing)
        {
            return;
        }
        isDrawing = true;

        if (CurrentAward == null)
        {
            await PopupService.ToastErrorAsync("抽奖失败", "全部奖品已经抽完");
            return;
        }
        if (Model.NotWinningUsers.Count == 0)
        {
            await PopupService.ToastErrorAsync("抽奖失败", "所有参与的用户都已抽中，但是还有奖品剩余");
            return;
        }

        var index = new Random().Next(0, Model.NotWinningUsers.Count - 1);
        //展示动画
        if (lotteryAnimationCard != null)
        {
            await lotteryAnimationCard.Roll(Model.NotWinningUsers[index].Number);
        }
        await Task.Delay(1000);

        LastWinningUser = Model.NotWinningUsers[index];
        Model.NotWinningUsers.Remove(LastWinningUser);

        CurrentAward.WinningUsers.Add(LastWinningUser);

        var model = new ManualLotteryModel
        {
            LotteryAwardId = CurrentAward.Id,
            LotteryId = Model.Id,
            UserId = LastWinningUser.Id
        };

        //导出数据
        LotteryResults.Add(model);
        var exportString = Newtonsoft.Json.JsonConvert.SerializeObject(LotteryResults, Newtonsoft.Json.Formatting.Indented);
        _logger.LogInformation(exportString);

        //获取下一个奖品
        await GetAward();
        var task = Task.Run(async () =>
        {
            try
            {
                var obj = await _httpService.PostAsync<ManualLotteryModel, Result>("api/lotteries/DrawLottery", model);
                //判断结果
                if (obj.Successful == false)
                {
                    await PopupService.ToastErrorAsync("抽奖失败", obj.Error);
                    _logger.LogError("抽奖失败，{error}", obj.Error);
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "抽奖失败");
            }
        });
        isDrawing = false;
    }

    public async Task GetAward()
    {

        LastAward = CurrentAward;


        var awards = Model.Awards.Where(s => s.TotalCount > s.WinningUsers.Count).OrderByDescending(s => s.Priority).ToList();


        if (awards.Count == 0)
        {

            CurrentAward = NextAward = null;
            //抽奖结束
            await EndLottery();
            return;
        }
        CurrentAward = awards[0];
        if (CurrentAward.TotalCount - CurrentAward.WinningUsers.Count > 1)
        {
            NextAward = CurrentAward;
        }
        else
        {
            if (awards.Count > 1)
            {
                NextAward = awards[1];
            }
            else
            {
                NextAward = null;
                return;
            }

        }

    }

    public async Task EndLottery()
    {
        try
        {
            var obj = await _httpService.PostAsync<EndLotteryModel, Result>("api/lotteries/EndLottery", new EndLotteryModel { Ids = new long[] { Model.Id }, IsEnd = true });
            //判断结果
            if (obj.Successful == false)
            {
                await PopupService.ToastErrorAsync("结束抽奖失败", obj.Error);
                _logger.LogError("结束抽奖失败，{error}", obj.Error);
            }
        }
        catch (Exception ex)
        {
            // await ErrorHandler.ProcessError(ex, "结束抽奖失败");
            _logger.LogError(ex, "结束抽奖失败");
        }
    }
}
